/**
 *  1. 什么是Promise(诺言 承诺)
 *  Promise是js中进行一步编程的新的解决方案（旧的是谁？）
 * 具体表达
 * 从语法上来说：Promise是一个构造函数
 * 从功能上来说：Promise对象用来封装一个异步操作并可以获取其结果
 * Promise的状态:
 *  pedding ---> resolve
 *  pedding ---> reject
 * 说明：
 *  只有这2种，且一个promise对象只能改变一次
 *  无论变为成功还是失败，都会有一个结果数据
 *  成功的结果数据一般称为value，失败的结果数据一般称为reason
 * 
 *  为什么使用Promise:
 *  1. 指定回调函数的方式更加灵活
 *  旧的：必须在启动异步任务前指定
 *  promise：启动异步任务 => 返回promise对象 => 给promise对象绑定回调函数（甚至可以在异步任务结束后指定/多个）
 *  2. 支持链式编程，解决回调地狱问题
 *  A.什么是回调地狱？
 *    回调函数嵌套调用，外部回调函数异步执行的结果是嵌套的回调函数执行的条件
 * B.  回调地狱的缺点？
 *   不便于阅读
 *   不便于异常处理
 * C.  解决方案？ promise
 *    终极解决方案： async/await
 */

 //体验Promise
 /* const promise = new Promise((resolve,reject)=>{ //执行器函数
   if(Date.now()%2===1){
     //执行成功了执行 resolve
     resolve(Date.now());
   }else{
     //执行失败执行 reject
     reject("时间是奇数执行不了");
   }
 })

 promise.then((data)=>{//  接受执行成功的数据
  console.log(data);
 },(error)=>{// 接受执行失败的数据
  console.log(error);
 })
 */
const  fs = require("fs");
const path = require("path");
 // 传统的函数回调问题

/*  function readFile(path){
   fs.readFile(path,'utf-8',(err,data)=>{
     if(err) throw err;
     console.log(data);
   });
 } */
 // 方法执行完成以后代码就直接输出结果了 
// readFile(path.join(__dirname,"../data/file1.txt"));

// 如果想在我们需要使用的时候在调用  方法的执行结果

// 返回值改为return 
// function readFile(path){
//   fs.readFile(path,'utf-8',(err,data)=>{
//     if(err) throw err;
//     return data;
//   });
  
// }
// // undefined  未定义
// console.log(readFile(path.join(__dirname,"../data/file1.txt")));

// 使用回调函数

// function readFile(path,callback){
//   fs.readFile(path,'utf-8',(err,data)=>{
//     if(err) throw callback(err);
//     callback(null,data);
//   });
  
// }
// // undefined  未定义
// readFile(path.join(__dirname,"../data/file1.txt"),(error,data)=>{
//   console.log("使用回调函数");
//   console.log(data);
// });

// 使用Promise 解决问题

function  readFile(path){
  const promise = new Promise((resolve,reject)=>{
    fs.readFile(path,'utf-8',(err,data)=>{
      console.log("异步函数读取文件");
      if(err) reject(err);
       resolve(data);
    })
  })

  return promise;
}
console.log("---------------------------");

readFile(path.join(__dirname,"../data/file1.txt"))
.then((data)=>{
  console.log("--------------使用promise---------");
  console.log(data);
},(error)=>{
  console.log(error);
})
/**
 * 
 *  程序开始执行  由于readFile是异步的函数所以先不执行  直接返回promise对象
 *  在使用then的时候才开始回调 resolve  回调函数   reject 失败的回调函数
 *  开始读取数据
 */